/** 播放接口 */
export interface UpdateMethod {
	Update(): void;
}

/** 播放控制类 */
export default class PlayController {

	/** 更新类 */
	private update: UpdateMethod;

	/** 成功回调 */
	private successCall: null | (() => void) = null;

	/** 运行状态 */
	private state: boolean = false;

	/** 运行状态 */
	public get State(): boolean {
		return this.state;
	}

	/**
	 * 构造函数
	 * @param paint 画板类
	 */
	constructor(paint: UpdateMethod) {
		this.update = paint;
	}

	/** 运行事件 */
	private async RunEvent(): Promise<void> {
		try {
			this.update.Update();
		} catch (err) {
			throw err;
		}
	}

	/** 检查是否运行结束 */
	private CheckStop(): boolean {
		if (!this.state) {
			const call = this.successCall;
			if (call) {
				call();
			}
			return true;
		}
		return false;
	}

	/** 循环事件 */
	private async RunFrame(): Promise<void> {
		try {
			if (this.CheckStop()) { return; }
			await this.RunEvent();
			if (this.CheckStop()) { return; }
			requestAnimationFrame(() => this.RunFrame());
		} catch (err) {
			throw err;
		}
	}

	/** 开始运行 */
	public Run(): void {
		if (this.state !== true) {
			this.state = true;
			this.RunFrame();
		}
	}

	/** 停止运行 */
	public async Stop(): Promise<void> {
		if (this.state) {
			this.state = false;
			return new Promise((res) => {
				this.successCall = res;
			});
		}
	}

	/**
	 * 插入运行
	 * @param call 要插入的回调函数
	 */
	public async Wait(call: () => Promise<void>) {
		if (this.state) {
			await this.Stop();
			await call();
			this.Run();
		} else {
			await call();
		}
	}
}
